package cn.tedu.truetaste.service.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.tedu.truetaste.ex.ServiceException;
import cn.tedu.truetaste.mapper.ShopMapper;
import cn.tedu.truetaste.mapper.UserMapper;
import cn.tedu.truetaste.pojo.dto.ShopAddNewDTO;
import cn.tedu.truetaste.pojo.dto.ShopUpdateDTO;
import cn.tedu.truetaste.pojo.entity.AuthenticationInfo;
import cn.tedu.truetaste.pojo.entity.Shop;
import cn.tedu.truetaste.pojo.vo.PictureStandardVO;
import cn.tedu.truetaste.pojo.vo.ShopStandardVO;
import cn.tedu.truetaste.restful.JsonPage;
//import cn.tedu.truetaste.security.LoginPrincipal;
import cn.tedu.truetaste.service.IShopService;
import cn.tedu.truetaste.web.ServiceCode;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
@Slf4j
public class ShopServiceImpl implements IShopService {

    @Value("${wx.appId}")
    private String appId;

    @Value("${wx.secret}")
    private String secret;

    private String openIdData;

    @Autowired
    private ShopMapper shopMapper;

    public ShopServiceImpl() {
        log.info("创建业务对象：ShopServiceImpl");
    }

    // 新增sku信息到购物车
    @Override
    public void addShop(ShopAddNewDTO shopAddNewDTO) {

        /*log.debug("开始处理【新增sku信息到购物车】的业务，参数：{}", shopAddNewDTO);
        Long userId = shopAddNewDTO.getUserId();
        UserStandardVO userStandardVO = userMapper.getStandardById(userId);*/

        // 实现新增购物车信息,要先判断这个skuId是否已经在当前用户购物车中包含了
        // 那么就必须先获取当前登录用户的userId
        // 需要编写方法从SpringSecurity上下文中获取
        //Long userId=getUserId();//空指针异常

        String openId = getUserOpenId(openIdData);

        Shop shop = shopMapper.selectExistsShop(openId,shopAddNewDTO.getSkuId());
        // 如果shop查询不为null,就表示这个商品已经存在于购物车了
        // 判断shop是否为null
        if(shop == null){
            // shop如果为null,表示购物车中没有这个商品,进行新增操作
            // 我们需要将shopAddNewDTO中的同名输出赋值到shop中,以便进行新增
            // 但是shop是null的话,赋值的过程会报null指针,所以要先实例化
            shop = new Shop();
            BeanUtils.copyProperties(shopAddNewDTO,shop);
            // shopAddNewDTO中没有userId的信息,需要单独赋值
            //shop.setUserId(userId);
            shop.setOpenId(openId);
            // 执行新增操作
            shopMapper.saveShop(shop);
        }else{
            // shop不是null,就要对当前购物车中商品进行数量的修改
            // 数量的值是当前购物车中数量+shopAddNewDTO参数中新增的数量
            // 因为数据库修改操作直接是赋值,所以在连库前,需要把数量加好
            // 我们将shop中的数量和shopAddNewDTO中的数量相加,在赋值给shop对象的num属性
            shop.setNum(shop.getNum()+shopAddNewDTO.getNum());
            // 按赋值后的信息执行修改
            shopMapper.updateNumById(shop);
        }

    }

    // 分页查询当前用户购物车信息
    @Override
    public JsonPage<ShopStandardVO> listShops(Integer page, Integer pageSize) {
        // 先从SpringSecurity上下文中获取当前登录用户Id
        //Long userId=getUserId();
        String openId = getUserOpenId(openIdData);
       // Long openId = getOpenId();

        // 设置查询分页的数据范围(page,pageSize)
        PageHelper.startPage(page,pageSize);
        // 上面的设置完成后,下面进行查询操作,会自动添加limit关键字在sql语句末尾
        List<ShopStandardVO> list=shopMapper.selectShopsByUserId(openId);
        // 返回JsonPage类型对象
        return JsonPage.restPage(new PageInfo<>(list));
    }

    @Override
    public ShopStandardVO getStandardByUserId(Long userId) {
        log.debug("开始处理【根据用户id查询购物车详情】的业务，参数：{}", userId);
        // 调用Mapper的getStandardById()执行查询
        ShopStandardVO shopStandardVO = shopMapper.getStandardByUserId(userId);
        System.out.println("-----"+shopStandardVO);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (shopStandardVO == null) {
            String message = "查询购物车详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", shopStandardVO);
        return shopStandardVO;
    }

    // 支持批量删除购物车信息的方法
    @Override
    public void removeShop(Long[] ids) {
        // 无需遍历ids直接将ids作为参数传给mapper方法
        int rows=shopMapper.deleteShopsByIds(ids);
        if(rows==0){
            String message = "您要删除的商品已经删除了!";
            log.warn(message);
            throw new ServiceException(
                    ServiceCode.ERR_NOT_FOUND,message);
        }
    }

    @Override
    public void removeAllShops() {
        String openId = getUserOpenId(openIdData);

       // Long openId = getOpenId();

        int rows=shopMapper.deleteShopsByUserId(openId);
        if(rows==0){
            String message = "您的购物车是空的!";
            log.warn(message);
            throw new ServiceException(
                    ServiceCode.ERR_NOT_FOUND,message);
        }
    }

    // 根据userId和skuId删除购物车商品的方法(新增订单用)
    @Override
    public void removeUserShops(Shop shop) {
        // 直接调用删除购物车中商品方法即可
        // 无需判断受影响行数,也不要抛出异常,购物车删除失败也不影响新增订单的流程
        shopMapper.deleteShopByUserIdAndSkuId(shop);
    }

    @Override
    public void updateNum(ShopUpdateDTO shopUpdateDTO) {
        Shop shop=new Shop();
        // 参数shopUpdateDTO中包含id和num属性,赋值给shop就可以执行修改了
        BeanUtils.copyProperties(shopUpdateDTO,shop);
        // shop执行修改
        shopMapper.updateNumById(shop);
    }


    public String getUserOpenId(String code) {
        String authUrl="https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";
        authUrl = authUrl + "&appid=" + appId + "&secret=" + secret + "&js_code=" + code;
        System.out.println("30000,"+authUrl);
        String result = HttpUtil.get(authUrl);

        JSONObject jsonObject = JSONUtil.parseObj(result);
        System.out.println(jsonObject);
        String openId = jsonObject.getStr("openid");
        openIdData = openId;
        return openId;
    }


//    public LoginPrincipal getUserInfo(){
//        // 获取SpringSecurity上下文
//        UsernamePasswordAuthenticationToken authenticationToken=
//                (UsernamePasswordAuthenticationToken)
//                        SecurityContextHolder.getContext().getAuthentication();
//
//        if(authenticationToken == null){
//            String message = "您还未登陆!";
//            log.warn(message);
//            throw new ServiceException(
//                    ServiceCode.ERR_UNAUTHORIZED,message);
//        }
//        // 从SpringSecurity上下文中获取用户信息
//        LoginPrincipal authenticationInfo =
//                (LoginPrincipal) authenticationToken.getPrincipal();
//
//        // 最终返回用户信息
//        return authenticationInfo;
//    }
//
//    private Long getUserId() {
//        return getUserInfo().getId();
//   }

}
